
#include "Socket.h"
#include "Protocol.h"
#include <iostream>
#include <string>

// 调用方式: ./client ip port
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        std::cerr << "使用方式错误,正确调用方式: " << argv[0] << " ip port" << std::endl;
        exit(Err_Use);
    }
    zmh::Intaddr serve_addr(AF_INET, argv[1], std::stoi(argv[2]));

    // 处理回复
    auto func = [](zmh::Response res)
    {
        if (res.Status() == 0)
            std::cout << "运行结果: " << res.Result() << std::endl;
        else
            std::cout << "运行出错: " << res.Outstatus(res.Status()) << std::endl;
    };

    // 协议层
    zmh::Protocol protocol;

    // 客户端
    std::shared_ptr<zmh::Socket> client = std::make_shared<zmh::Tcp_Socket>();
    client->GetConnectSocket(serve_addr);

    while (true)
    {
        // step1 获取用户输入数据
        int x, y;
        std::cout << "Please Input   X : ";
        std::cin >> x;
        std::cout << "Please Input   Y : ";
        std::cin >> y;
        char oper;
        std::cout << "Please Input Oper: ";
        std::cin >> oper;
        zmh::Request req(x, y, oper);

        // step2 将用户输入数据序列化
        std::string json_str = req.Serialize();

        // step3 添加报头
        protocol.EnHeader(json_str);
	
	int cnt = 5;
	while(cnt--)
	{
        // step4 完成一次发送
        protocol.Send(client, json_str);
	}

        // step5 获取与处理回复
        protocol.GetResponse(client, func);
    }

    return 0;
}
